/**
 * 学生选课系统后端服务器
 */

const express = require('express');
const cors = require('cors');
const morgan = require('morgan');
const helmet = require('helmet');
const { db } = require('./db');

// 导入路由模块
const authRoutes = require('./routes/auth');
const studentRoutes = require('./routes/students');
const teacherRoutes = require('./routes/teachers');
const courseRoutes = require('./routes/courses');
const enrollmentRoutes = require('./routes/enrollments');

const app = express();
const port = process.env.PORT || 3000;

// 安全中间件
app.use(helmet());  // 添加各种 HTTP 头以帮助保护应用

// 基础中间件配置
app.use(cors());  // 允许跨域请求
app.use(morgan('dev'));  // 请求日志记录
app.use(express.json());  // 解析JSON请求体
app.use(express.urlencoded({ extended: true }));  // 解析URL编码的请求体

// API速率限制
const rateLimit = require('express-rate-limit');
const apiLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15分钟
  max: 100 // 限制每个IP 15分钟内最多100个请求
});
app.use('/api/', apiLimiter);

// 注册路由
app.use('/api/auth', authRoutes.router);
app.use('/api/students', studentRoutes);
app.use('/api/teachers', teacherRoutes);
app.use('/api/courses', courseRoutes);
app.use('/api/enrollments', enrollmentRoutes);

// 基础路由 - 用于测试服务器是否正常运行
app.get('/', (req, res) => {
  res.json({ 
    message: '学生选课系统API服务器正在运行',
    version: '1.0.0',
    docs: '/api/docs'  // API文档路径（待实现）
  });
});

// 测试数据库连接
app.get('/api/test-db', (req, res) => {
  db.get('SELECT 1', (err) => {
    if (err) {
      res.status(500).json({ error: '数据库连接失败', details: err.message });
    } else {
      res.json({ message: '数据库连接正常' });
    }
  });
});

// 404错误处理
app.use((req, res) => {
  res.status(404).json({ error: '请求的资源不存在' });
});

// 错误处理中间件
app.use((err, req, res, next) => {
  console.error(err.stack);
  
  // 处理特定类型的错误
  if (err.name === 'UnauthorizedError') {
    return res.status(401).json({ error: '无效的认证令牌' });
  }
  
  if (err.name === 'ValidationError') {
    return res.status(400).json({ error: '请求数据验证失败', details: err.message });
  }
  
  // 默认错误响应
  res.status(500).json({ 
    error: '服务器内部错误', 
    details: process.env.NODE_ENV === 'development' ? err.message : '请联系系统管理员'
  });
});

// 启动服务器
const server = app.listen(port, () => {
  console.log(`服务器正在运行，端口: ${port}`);
});

// 优雅关闭
const gracefulShutdown = () => {
  console.log('收到关闭信号，准备关闭服务器...');
  
  server.close(() => {
    console.log('已停止接受新的连接');
    
    db.close(() => {
      console.log('数据库连接已关闭');
      process.exit(0);
    });
  });

  // 如果在10秒内没有完成关闭，则强制退出
  setTimeout(() => {
    console.error('无法正常关闭服务器，强制退出');
    process.exit(1);
  }, 10000);
};

process.on('SIGTERM', gracefulShutdown);
process.on('SIGINT', gracefulShutdown);

// 处理未捕获的Promise拒绝
process.on('unhandledRejection', (reason, promise) => {
  console.error('未处理的Promise拒绝:', reason);
});

// 处理未捕获的异常
process.on('uncaughtException', (error) => {
  console.error('未捕获的异常:', error);
  gracefulShutdown();
});
